package com.sxt;

import java.awt.*;

public class Line {
    //起点坐标
    int x = 380;
    int y = 180;

    //终点坐标
    int endx = 500;
    int endy = 500;

    //线长
    double length = 100;
    //线长最小值
    double MIN_length = 100;
    //线长最大值
    double MAX_length = 750;

    //为了使其从x轴右边开始转动，所以n设为0
    double n = 0;

    //红线摆动方向限定 -> 1表示角度增加往左边移动，-1表示角度减小往右边移动
    int dir = 1;

    //状态： 0->摇摆  1->抓取  2->收回 3->碰撞成功，抓取返回
    int state;

    //钩爪图片
    Image hook = Toolkit.getDefaultToolkit().getImage("C://Users//admin//IdeaProjects//The Gold Miner//imgs//hook.png");

    GameWin frame;

    Line(GameWin frame){
        this.frame = frame;
    }

    //(碰撞检测，检测物体是否被抓取)
    void logic(){
        //增强for循环
        for(Object obj:this.frame.objectList){
            if (endx > obj.x && endx < obj.x+obj.width
                    && endy > obj.y && endy < obj.y+obj.height){
                state = 3;
                obj.flag = true;//碰撞到以后，金块状态发生改变

            }
        }

    }

    //绘制方法
    void lines(Graphics g){
        endx = (int) (x + length*Math.cos(n*Math.PI)); //因为角度是double类型所以要强制转换成int类型
        endy = (int) (y + length*Math.sin(n*Math.PI));
        g.setColor(Color.red);
        g.drawLine(x-1,y,endx-1,endy);
        g.drawLine(x,y,endx,endy);
        g.drawLine(x+1,y,endx+1,endy);
        g.drawImage(hook,endx-36,endy-2,null);
    }

    void paintSelf(Graphics g) {
        //调用线与物块碰撞的方法
        logic();
        //线的状态设置
        switch (state) {
            case 0://左右摇摆
                if (n < 0.1) {
                    dir = 1;
                } else if (n > 0.9) {
                    dir = -1;
                }
                n = n + 0.005 * dir;
                lines(g);
                break;
            case 1://延长线长度
                if (length < MAX_length) {//如果线长小于最大线长就可以延长
                    length = length + 5;
                    lines(g);
                } else {
                    state = 2;
                }//延长后无其他操作，可以将其状态置为0,让它继续执行左右摇摆以及红线的绘制
                break;
            case 2://红线收回
                if (length > MIN_length) {//返回不能低于最小值
                    length = length - 5;
                    lines(g);
                } else {
                    state = 0;
                }
                break;
            case 3://红线碰到金块，红线返回的情况
                int m = 1;//质量默认值
                if (length > MIN_length) {
                    length = length - 10;
                    lines(g);
                    for (Object obj : this.frame.objectList) {
                        if(obj.flag){//先判断金块是否能移动
                             m = obj.m;
                            //金块偏移
                            obj.x = endx - obj.getWidth()/2;//通过调用父类Object的宽度，无论金块还是石块都可以直接拿到对应图片大小的一半
                            obj.y = endy;
                            if (length <= MIN_length) {
                                //金块移除 - >将金块移动到屏幕外
                                obj.x = -150;
                                obj.y = -150;
                                obj.flag = false;
                                Bg.waterFlag = false;//药水变得不可用
                                //加分
                                Bg.count += obj.count;
                                state = 0;
                            }
                            if (Bg.waterFlag) {//使用药水
                                if(obj.type == 1){//金块
                                    m = 1;//质量置为1实现右击快速抓取的效果
                                }
                                if(obj.type == 2){
                                    //石块爆破，石块移除 - >将石块移动到屏幕外
                                    obj.x = -150;
                                    obj.y = -150;
                                    obj.flag = false;
                                    //药水变为不可使用
                                    Bg.waterFlag = false;
                                    //红线置为收回状态
                                    state = 2;

                                }
                            }

                        }
                    }
                }

                try {
                    Thread.sleep(m);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                break;

            default:
        }
    }

    //重置线
    void reGame(){
        //线的角度
        n = 0;
        //线长
        length = 100;
    }
}







